package com.chinamsp.dydb.query;

import java.io.Serializable;


/**
 * 通用查询条件的封装。可以调用parseCondition()方法生成一个条件，目前支持单个条件和多个条件两种格式
 * 单个条件传 属性名_类型_比较符 , 多个条件传 属性1-属性2-属性*_类型_比较符。多个条件解析后各条件之间是 or 的关系 [如同时按邮箱和姓名查询]
 * @see SingleFieldCondition
 * @see MultiFieldCondition
 * @author shifenghu
 *
 */
public abstract class Condition implements Serializable{

	private static final long serialVersionUID = 6323255822270908073L;
	
	/**
	 * 多个字段时，字段之间的分隔符
	 */
	public static final String FIELDS_DELIMETER ="-";
	/**
	 * 字段和操作符等中间的连接符。
	 */
	public static final String FIELD_INTERNAL_DELIMETER ="_" ;
	
	/**
	 * 解析 全参
	 * @param parameter
	 */
	protected abstract void parse(String parameter);
	
	/**
	 * 
	 * 设置查询的字段名及查询类型
	 * @param paratemer
	 */
	public static Condition parseCondition(String parameter){
		return parseCondition(parameter, null);
	}
	
	/**
	 * 
	 * 设置查询的字段名及查询类型 并设置值
	 * @param parameter 参数表达式
	 * @param value 设置的值
	 */
	public static Condition parseCondition(String parameter, Object value){
		Condition condition ; 
		int fieldIndex = parameter.indexOf(FIELDS_DELIMETER);  //是否为多个字段
		if(fieldIndex == -1){
			condition = new SingleFieldCondition();
		}else{
			condition = new MultiFieldCondition();
		}
		condition.parse(parameter);
		condition.setValue(value);
		return condition;
	}
	

	
	public abstract SymbolType getOperator() ;
	public abstract void setOperator(SymbolType operator) ;
	public abstract String getField() ;
	public abstract void setField(String field) ;
	public abstract Object getValue() ;
	public abstract FieldType getType() ;
	public abstract void setType(FieldType type) ;
	/**
	 * 获取 sql  值
	 * @return
	 */
	public abstract Object getSqlValue() ;
	/**
	 * 获取 sql 操作符
	 * @return
	 */
	public abstract String getSqlOperator();
	public abstract void setValue(Object value) ;
	
	/**
	 * 忽略值
	 * @return
	 */
	public abstract boolean isIgnore();
}
